package guigu.IoSystem;

import org.junit.Test;

import java.io.*;

/**
 * 处理流之一：缓冲流的使用
 * 1. 缓冲流：
 *    BufferedInputStream
 *    BufferedOutputStream
 *    BufferedReader
 *    BufferedWriter
 *
 * 2.作用：提高流的读取、写入的速度
 *   提高读写速度的原因：内部提供了一个缓冲区
 */
public class BufferedInputStreamTest {
    /*
    实现非文本文件的复制
     */
    @Test
    public void test1()
    {
        //1.造文件
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        try {
            File srcFile = new File("微信图片_20220828222640.jpg");
            File destFile = new File("微信图片_202208282226402.jpg");
            //2.造流
            //2.1造节点流
            FileInputStream fis = new FileInputStream(srcFile);
            FileOutputStream fos = new FileOutputStream(destFile);
            //2.2造缓冲流
            bis = new BufferedInputStream(fis);
            bos = new BufferedOutputStream(fos);
            //3.复制的细节：读取、写入

            byte buffer[] = new byte[1024];
            int len;
            while ((len=bis.read(buffer))!=-1)
            {
                bos.write(buffer,0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.资源关闭
            //要求：先关闭外层的流，再关闭内层的流
            if(bos!=null)
            {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bis!=null)
            {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //说明：关闭外层流的同时，内层流也会自动进行关闭。关于内层流的关闭。我们可以省略。
            //fos.close();
            //fis.close();
        }
    }

    /*
    实现文本文件的复制
     */
    @Test
    public void test2()
    {
        BufferedReader bis = null;
        BufferedWriter bos = null;
        try {
            File srcFile = new File("hello.txt");
            File destFile = new File("hello3.txt");

            FileReader fis = new FileReader(srcFile);
            FileWriter fos = new FileWriter(destFile);

            bis = new BufferedReader(fis);
            bos = new BufferedWriter(fos);

            char cubf[] = new char[5];
            int len;
            //方式一
//            while ((len=bis.read(cubf))!=-1)
//            {
//                bos.write(cubf,0,len);
//            }
            //方式二
            String data;
            while ((data=bis.readLine())!=null)
            {
                //方法一
                //bos.write(data+"\n");//不包含换行符
                //方法二
                bos.write(data);
                bos.newLine();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bos!=null)
            {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(bis!=null)
            {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
